package Data_Structure.Queue;

/**
 * @className: MyQueue2
 * @author: 芃
 * @description: 使用数组模拟实现队列
 * @date: 2023/8/22 10:24
 */
//使用数组实现的队列也称为循环队列，该数组为循环数组
public class MyCircularQueue {
    private int[] elem;
    private int front;//对头下标
    private int rear;//队尾下标

    public MyCircularQueue(int k) {
        this.elem = new int[k+1];
    }

    //入队
    public boolean enQueue(int value) {
        if (isFull()){
            return false;
        }else {
            this.elem[rear] = value;
            rear = (rear + 1) % this.elem.length;//计算rear的下一个下标
            return true;
        }
    }

    //出队
    public boolean deQueue() {
        if (isEmpty()){//队列为空
            return false;
        }else {
            front = (front + 1) % elem.length;
            return true;
        }
    }

    //获取队头元素
    public int Front() {
        if (isEmpty()){
            return -1;
        }else {
            return this.elem[this.front];
        }
    }
    //获取队尾元素
    public int Rear() {
        if (isEmpty()){
            return -1;
        }else {
            int index = -1;
            if (rear == 0){//对0下标特殊处理
                index = this.elem.length - 1;
            }else {
                index = this.rear - 1;
            }
            return this.elem[index];
        }
    }

    public boolean isEmpty() {
        return this.front == this.rear;
    }

    public boolean isFull() {
        //浪费一个格子作为标记
        //rear的下一个是front，就满了
        //假设是数组大小为8，rear走到7时，front在0时，下面的表达式结果为0，此时就说明满了
        //仍然假设数组大小为8，rear走到1时，front在2时，下面的表达式结果为2，此时也说明满了
        if ((this.rear + 1) % this.elem.length == front){
            return true;
        }else {
            return false;
        }
    }
}
